import axios from "axios"
import { getToken } from "@/util/auth"
import {tansParams} from "@/util/jsonUtil";
import errorCode from "@/util/errorCode";
import {Dialog, showDialog} from "vant";
import {useRouter} from "vue-router";

let router = useRouter();
// 是否显示重新登录
export let isRelogin = { show: false }

axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8"
// 对应国际化资源文件后缀
axios.defaults.headers["Content-Language"] = "zh_CN"
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // baseURL: "http://localhost:8128",
  // 超时
  timeout: 120000
})

// 初始化一个变量来记录最近一次请求的时间 单位为ms
const lastRequestTime = {}
const MIN_REQUEST_INTERVAL = 1000


// request拦截器
service.interceptors.request.use(
  config => {
    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false
    // // 是否需要防止数据重复提交
    // const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
    if (getToken() && !isToken) {
      config.headers["Authorization"] = "Bearer " + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
      config.headers["Access-Control-Allow-Origin"] = "*"
    }
    // get请求映射params参数
    if (config.method === "get" && config.params) {
      let url = config.url + "?" + tansParams(config.params)
      url = url.slice(0, -1)
      config.params = {}
      config.url = url
    }
    // 判断当前请求的 HTTP 方法是否是 GET 方法 如果不是 GET 方法，直接返回请求配置，不进行时间间隔的判断
    if (config.method.toUpperCase() === "GET") {
      return config
    }

    // 如果当前请求路径不存在于记录对象中，说明此路径还没有发送过请求
    const now = Date.now()
    if (!lastRequestTime[config.url]) {
      lastRequestTime[config.url] = 0
    }
    // 判断当前时间减去这个路径最近一次请求时间是否小于规定时间间隔
    if (now - lastRequestTime[config.url] < MIN_REQUEST_INTERVAL) {
      console.log(`${config.url} 重复请求`)
      return Promise.reject(new Error(`请勿频繁点击操作`))
    }
    // 如果时间间隔不小于规定时间间隔，记录本次请求时间，以进行下一次请求的时间计算
    lastRequestTime[config.url] = now

    return config
  },
  error => {
    console.log(error)
    Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  res => {
    // 未设置状态码则默认成功状态
      const code = res.data.code || 200
    // 获取错误信息
    const msg = errorCode[code] || res.data.msg || errorCode["default"]
      console.log(msg);
      console.log(code);
      // 二进制数据则直接返回
    // if (res.request.responseType === "blob" || res.request.responseType === "arraybuffer") {
    //   return res.data
    // }

    switch (code) {
      case 401:
        if (!isRelogin.show) {
          isRelogin.show = true
            anewLogin()
        }
        console.log("401 end")
        return Promise.reject("无效的会话，或者会话已过期，请重新登录。")

      case 500:
          showDialog({
              title: '请求失败',
              message: msg,
          }).then(() => {
              // on close
          });
        return Promise.reject(res.data)

      default:
        if (code !== 200) {
          Notification.error({
            title: msg
          })
          return Promise.reject("error")
        } else {
          if (res.data.rule != null) {
            console.log(`%c${res.data.rule}`, "color:red")
          }
          return res.data
        }
    }
  }
)

function anewLogin(){
    function beforeClose(action, done) {
        if (action === 'confirm') {
            doAnewLogin()
        } else {
            done();
        }
    }

    Dialog.confirm({
        title: '标题',
        message: '登录状态已过期，您可以继续留在该页面，或者重新登录"',
        beforeClose,
    });
}

function doAnewLogin(){
    router.push({
        // path: "/video-call-calling-view",
        path: "/",
    });
}


export default service
